#include <inctypes.h>
#include <incctrls.h>

/*********************************************************************************
 * 
 * krl_add_isrhandle - 安装设备回调函数的接口
 * 
 * DESCRIPTION
 */

intisrdsc_t * krl_add_isrhandle 
    (
    void *      device, 
    inthandle_t handle, 
    uint_t      ifdidx
    )
    {
    intsrcdsc_t * intsrcdsc;
    intisrdsc_t * intisrdsc;

    /* 判断设备描述符和中断回调函数的有效性 */
    
    if ((device == NULL) || (handle == NULL))
        {
        return NULL;
        }

    /* 获得中断源描述符 */

    intsrcdsc = intrpt_return_intsrcdsc (ifdidx);

    if (intsrcdsc == NULL)
        {
        return NULL;    /* 未找到中断描述符 */
        }

    /* 分配一个 intisrdsc_t 结构体 */

    intisrdsc = (intisrdsc_t *) krl_mem_new (sizeof (intisrdsc_t));

    if (intisrdsc == NULL)
        {
        return NULL; /* 分配空间失败 */
        }

    /* 初始化 intisrdsc_t 结构体 */

    intisrdsc_t_init (intisrdsc, 0, intsrcdsc, device, handle);

    /* 将 intisrdsc_t 添加到 intsrcdsc_t */

    if (intrpt_add_intisr_to_intsrcdsc (intsrcdsc, intisrdsc) == FALSE)
        {
        if (krl_mem_delete ((addr_t) intisrdsc, sizeof (intisrdsc_t)) == FALSE) /* 释放内存 */
            {
            krl_system_die ("intrpt_add_isrhandle err\r\n");
            return NULL;
            }

        return NULL;    /* 添加失败 */
        }
    
    return intisrdsc;
    }

/*********************************************************************************
 * 
 * krl_enable_irq - 
 * 
 * DESCRIPTION
 */

drvstus_t krl_enable_irq 
    (
    uint_t ifdidx
    )
    {
    drvstus_t ret;

    ret = intrpt_enable_irq (ifdidx);

    return ret;
    }

/*********************************************************************************
 * 
 * krl_disable_irq - 
 * 
 * DESCRIPTION
 */


drvstus_t krl_disable_irq 
    (
    uint_t ifdidx
    )
    {
    drvstus_t ret;

    ret = intrpt_disable_irq (ifdidx);

    return ret;    
    }